
/*
比大小押注赌输赢游戏，电脑庄家和玩家PK
事先设定好玩家和庄家的积分（2000分）
程序模拟N个骰子投掷，让玩家猜：大小/豹子
玩家选择下注多少分值，程序根据结果确定玩家的输赢
猜大小的胜方获得1倍下注积分，猜豹子胜方获得5倍下注积分，败方扣除相同积分
积分随着输赢改变后，重复掷骰子， 直到积分小于 0，游戏结束 。
*/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

#define DICENUM 3
float ave = DICENUM * 7.0 / 2;
void menu() // 显示菜单
{
	printf("\t\t\t****************************************\n");
	printf("\t\t\t***       比大小押注赌输赢游戏       ***\n");
	printf("\t\t\t***         Welcome to play!         ***\n");
	printf("\t\t\t***     游戏仅供娱乐，请勿赌博哟     ***\n");
	printf("\t\t\t***   庄家与玩家初始积分均为2000分   ***\n");
	printf("\t\t\t***       庄家每局投掷3枚骰子        ***\n");
	printf("\t\t\t***    玩家猜大(大于中位数)倍数为1   ***\n");
	printf("\t\t\t***    玩家猜小(小于中位数)倍数为1   ***\n");
	printf("\t\t\t***   玩家猜豹子(3个数相同)倍数为5   ***\n");
	printf("\t\t\t*** 玩家选择下注积分,由猜测确定倍数  ***\n");
	printf("\t\t\t***    胜方获得积分,败方扣除积分     ***\n");
	printf("\t\t\t***      一方积分为0时游戏结束       ***\n");
	printf("\t\t\t***          你能战胜庄家吗?         ***\n");
	printf("\t\t\t****************************************\n");
}

void ThrowDice(int anDice[]) // 投掷骰子并输出骰子数字
{
	int i = 0;
	printf("\t\t\t骰子数字为:");
	for (i = 0; i < DICENUM; i++)
	{
		anDice[i] = rand() % 6 + 1;
		printf("%d  ", anDice[i]);
	}
	printf("\n");
}

int GetInput(int nUserScore, int nComputerScore, int *nChoice, int *nBetScore) // 玩家选择选项,并选择押注分数,系统判断押注分数是否合规
{
l1:
	printf("\n\t\t请选择猜测选项:0、退出游戏 1、大 2、小 3、豹子 ->");
	scanf(" %d", nChoice);
	int Times = 1;
	switch (*nChoice)
	{
	case 0:
		return 0;
	case 3:
		Times = 5;
	case 1:
	case 2:
	l2:
		printf("\t\t\t请输入押注分数: ->");
		scanf(" %d", nBetScore);
		break;
	default:
		printf("\n\t\t\t输入错误,请重新输入!\n");
		goto l1;
	}
	if (*nBetScore <= 0 || (*nBetScore * Times) > nUserScore || (*nBetScore * Times) > nComputerScore)
	{
		printf("\n\t\t\t您或庄家的积分不足,请重新输入!\n");
		goto l2;
	}
	return 1;
}

int JudgeChoice(int anDice[], int nChoice) // 根据玩家选项和骰子数字判断盈亏和倍率
{
	int sum = 0;
	if (nChoice != 3)
	{
		int i = 0;
		for (i = 0; i < DICENUM; i++)
		{
			sum += anDice[i];
		}
		printf("\t\t\t骰子数字总和为:%d\n", sum);
	}
	switch (nChoice)
	{
	case 1:
		if (sum > ave)
			return 1;
		else
			return -1;
	case 2:
		if (sum < ave)
			return 1;
		else
			return -1;
	case 3:
		if (anDice[0] == anDice[1] == anDice[2])
			return 5;
		else
			return -5;
	}
}

int ComputeScore(int nTimes, int nBetScore, int *nUScore, int *nCScore) // 计算当前玩家分数和电脑分数
{
	*nUScore += nTimes * nBetScore;
	*nCScore -= nTimes * nBetScore;
	printf("\t\t\t当前玩家分数:  %d分\n", *nUScore);
	printf("\t\t\t当前庄家分数:  %d分\n", *nCScore);
	if (*nCScore == 0 || *nUScore == 0)
		return 0;
	else
		return 1;
}

int main()
{
l3:
	srand((int)time(NULL));
	int nComputerScore = 2000; // 电脑积分
	int nUserScore = 2000;	   // 玩家积分
	int nChoice;			   // 玩家猜测
	int nBetScore;			   // 玩家下注
	int anDice[DICENUM];	   // 每个骰子的随机数
	int nTimes;				   // 输赢倍数
	int bContinue = 1;		   // 判断游戏是否能继续
	char input = 'N';
	menu();
	while (bContinue)
	{
		if (GetInput(nUserScore, nComputerScore, &nChoice, &nBetScore) == 0)
			goto l5;
		ThrowDice(anDice);
		nTimes = JudgeChoice(anDice, nChoice);
		if (nTimes > 0)
		{
			printf("\t\t\t***         真厉害,你押中了!         ***\n");
			printf("\t\t\t获得   %d分 \n", nTimes * nBetScore);
		}
		else
		{
			printf("\t\t\t***         真遗憾,你没押中!         ***\n");
			printf("\t\t\t失去   %d分\n", -nTimes * nBetScore);
		}
		bContinue = ComputeScore(nTimes, nBetScore, &nUserScore, &nComputerScore);
	}
	if (nUserScore == 0)
		printf("\t\t\t真遗憾,您还是没能胜过庄家!\n");
	else
		printf("\t\t\t真是太厉害了,您赢得了游戏!\n");
l4:
	printf("\t\t\t游戏结束,想再次游玩吗(Y / N)? -> ");
	scanf(" %c", &input);
	if (input == 'Y' || input == 'y')
	{
		system("cls");
		goto l3;
	}
	else if (input == 'N' || input == 'n')
		;
	else
	{
		printf("\n\t\t\t输入错误,请重新输入!\n");
		goto l4;
	}
l5:
	printf("\t\t\t***          欢迎下次游玩!           ***\n"); // 结束界面
	return 0;
}
